# 作者： 李泉志
# 2025年01月08日16时39分秒
# 2947029073@qq.com

"""
选中代码行,shift向后缩进，shift+tab向前缩进
"""
"""
面向对象基础语法
目标
• dir 内置函数
• 定义简单的类（只包含方法）
• 方法中的 self 参数
• 初始化方法
• 内置方法和属性

02. 定义简单的类（只包含方法）
面向对象是更大的封装，在一个类中封装多个方法，这样通过这个类创建出来的对象，
就可以直接调用这些方法了！

2.1 定义只包含方法的类
• 在 Python 中要定义一个只包含方法的类，语法格式如下：
class 类名:
    def 方法 1(self, 参数列表):
        pass
    def 方法 2(self, 参数列表):
        pass
• 方法 的定义格式和之前学习过的函数几乎一样
• 区别在于第一个参数必须是 self
注意：类名的命名规则要符合大驼峰命名法

2.2 创建对象
• 当一个类定义完成之后，要使用这个类来创建对象，语法格式如下：
实例化: 对象变量 = 类名()
"""

class Cat:
    """这是一个猫类"""
    def eat(self):
        print("小猫爱吃鱼")
    def drink(self):
        print("小猫在喝水")
tom = Cat()
tom.drink()
tom.eat()

lazy_cat = Cat()
print(tom is lazy_cat)  # False，故tom和lazy_cat是两个不同的对象，地址不同
"""
引用概念的强调
在面向对象开发中，引用的概念是同样适用的！
• 在Python中使用类创建对象之后，tom变量中仍然记录的是对象在内存中的地址
• 也就是tom变量引用了新建的猫对象
• 使用print输出 对象变量，默认情况下，是能够输出这个变量引用的对象是
    由哪一个类创建的对象，以及在内存中的地址（十六进制表示）
提示：在计算机中，通常使用十六进制表示内存地址
• 十进制和十六进制都是用来表达数字的，只是表示的方式不一   样
• 十进制和十六进制的数字之间可以来回转换
• %d20 可以以 10 进制 输出数字
• %x 可以以 16 进制 输出数字
"""
"""
03. 方法中的 self 参数
3.1 案例改造 —— 给对象增加属性
• 在 Python 中，要给对象设置属性，非常的容易，但是不推荐使用
    – 因为：对象属性的封装应该封装在类的内部
• 只需要在类的外部的代码中直接通过'.'设置一个属性即可
注意：这种方式虽然简单，但是不推荐使用！
tom.name = "Tom"

3.2 使用 self 在方法内部输出每一只猫的名字
由哪一个对象调用的方法，方法内的self就是哪一个对象的引用
• 在类封装的方法内部，self就表示当前调用方法的对象自己
• 调用方法时，程序员不需要传递self参数
• 在方法内部
    – 可以通过 self. 访问对象的属性
    – 也可以通过 self. 调用其他的对象方法
• 在类的外部，通过变量名.访问对象的属性和方法
• 在类封装的方法中，通过 self.访问对象的属性和方法
"""

